package com.zenithmind.version.pojo.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * 标签实体类
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("version_tag")
@Schema(description = "标签实体")
public class Tag extends BaseEntity {

    /**
     * 仓库ID
     */
    @Schema(description = "仓库ID")
    private String repositoryId;

    /**
     * 标签名称
     */
    @Schema(description = "标签名称")
    private String name;

    /**
     * 标签描述
     */
    @Schema(description = "标签描述")
    private String description;

    /**
     * 标签类型（1-轻量标签，2-注释标签，3-发布标签）
     */
    @Schema(description = "标签类型（1-轻量标签，2-注释标签，3-发布标签）")
    private Integer type;

    /**
     * 目标提交ID
     */
    @Schema(description = "目标提交ID")
    private String targetCommitId;

    /**
     * 目标提交哈希
     */
    @Schema(description = "目标提交哈希")
    private String targetCommitHash;

    /**
     * 目标类型（1-提交，2-树，3-blob）
     */
    @Schema(description = "目标类型（1-提交，2-树，3-blob）")
    private Integer targetType;

    /**
     * 标签消息
     */
    @Schema(description = "标签消息")
    private String message;

    /**
     * 创建者ID
     */
    @Schema(description = "创建者ID")
    private String creatorId;

    /**
     * 版本号
     */
    @Schema(description = "版本号")
    private String version;

    /**
     * 版本序号
     */
    @Schema(description = "版本序号")
    private Integer versionOrder;

    /**
     * 是否预发布（0-否，1-是）
     */
    @Schema(description = "是否预发布（0-否，1-是）")
    private Integer isPrerelease;

    /**
     * 是否草稿（0-否，1-是）
     */
    @Schema(description = "是否草稿（0-否，1-是）")
    private Integer isDraft;

    /**
     * 发布说明
     */
    @Schema(description = "发布说明")
    private String releaseNotes;

    /**
     * 标签时间
     */
    @Schema(description = "标签时间")
    private LocalDateTime tagTime;

    /**
     * 发布时间
     */
    @Schema(description = "发布时间")
    private LocalDateTime releaseTime;

    /**
     * 检查是否为轻量标签
     *
     * @return 是否为轻量标签
     */
    public boolean isLightweightTag() {
        return Integer.valueOf(1).equals(this.type);
    }

    /**
     * 检查是否为注释标签
     *
     * @return 是否为注释标签
     */
    public boolean isAnnotatedTag() {
        return Integer.valueOf(2).equals(this.type);
    }

    /**
     * 检查是否为发布标签
     *
     * @return 是否为发布标签
     */
    public boolean isReleaseTag() {
        return Integer.valueOf(3).equals(this.type);
    }

    /**
     * 检查是否为预发布版本
     *
     * @return 是否为预发布版本
     */
    public boolean isPrerelease() {
        return Integer.valueOf(1).equals(this.isPrerelease);
    }

    /**
     * 检查是否为草稿
     *
     * @return 是否为草稿
     */
    public boolean isDraft() {
        return Integer.valueOf(1).equals(this.isDraft);
    }

    /**
     * 检查是否已发布
     *
     * @return 是否已发布
     */
    public boolean isReleased() {
        return releaseTime != null && !isDraft();
    }

    /**
     * 检查是否为稳定版本
     *
     * @return 是否为稳定版本
     */
    public boolean isStableRelease() {
        return isReleased() && !isPrerelease();
    }

    /**
     * 获取显示版本号
     *
     * @return 显示版本号
     */
    public String getDisplayVersion() {
        if (version != null && !version.isEmpty()) {
            return version;
        }
        return name;
    }
}
